﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;
using System.Collections.ObjectModel;


namespace Sinacor.UI.Bovespa.Alocacao.Presenter 
{
	public class DivergenciaCentralDepositaria : AlocacaoBase<IDivergenciaCentralDepositaria> 
	{
        public DivergenciaCentralDepositaria(IDivergenciaCentralDepositaria view)
            : base(view)
        {
            this.FiltroDivergenciaCentralDepositaria = new Sinacor.UI.Bovespa.Alocacao.Model.Parameter.FiltroDivergenciaCentralDepositaria();
            this.ListaDivergenciasCentralDepositaria = new ModelCollection<Sinacor.UI.Bovespa.Alocacao.Model.DivergenciaCentralDepositaria>();        
        }
		#region Atributos
		/// <summary>
		/// Canal de comunicação com o serviço de divergencia de alocação de negócios na
		/// central depositaria
		/// </summary>
		private Communication.DivergenciaCentralDepositaria _communicationDivergenciaCentralDepositaria;
		/// <summary>
		/// Filtro de pesquisa bindado na tela
		/// </summary>
		private Model.Parameter.FiltroDivergenciaCentralDepositaria _filtroDivergenciaCentralDepositaria;
		/// <summary>
		/// Lista de divergências de alocação de negócios na central depositária.
		/// </summary>
		private ModelCollection<Model.DivergenciaCentralDepositaria> _listaDivergenciasCentralDepositaria;
		/// <summary>
		/// Nalc válido bindado na tela
		/// </summary>
		private Model.NalcValido _nalcValido;

		#endregion

		#region Propriedades
		/// <summary>
		/// Filtro de pesquisa bindado na tela
		/// </summary>
		public Model.Parameter.FiltroDivergenciaCentralDepositaria FiltroDivergenciaCentralDepositaria
		{
			get { return _filtroDivergenciaCentralDepositaria; }
			set { _filtroDivergenciaCentralDepositaria = value; }
		}

		/// <summary>
		/// Lista de divergências de alocação de negócios na central depositária.
		/// </summary>
		public ModelCollection<Model.DivergenciaCentralDepositaria> ListaDivergenciasCentralDepositaria
		{
			get { return _listaDivergenciasCentralDepositaria; }
			set { _listaDivergenciasCentralDepositaria = value; }
		}

		/// <summary>
		/// Nalc válido bindado na tela
		/// </summary>
		public Model.NalcValido NalcValido
		{
			get { return _nalcValido; }
			set { _nalcValido = value; }
		}

        public ObservableCollection<EnumWrapper<Model.Enum.TipoMercado>> EnumTipoMercado
        {
            get;
            set; 
        }
		#endregion

		#region Métodos
        #region ConsultarDivergenciasCentralDepositaria
        /// <summary>
        /// Consulta a lista de divergências de alocação de negocios na central depositária
        /// conforme o filtro de pesquisa.
        /// </summary>
        public void ConsultarDivergenciasCentralDepositaria()
        {
            try
            {
                Communication.DivergenciaCentralDepositaria executar = new Sinacor.UI.Bovespa.Alocacao.Communication.DivergenciaCentralDepositaria(this.Session);
                ListaDivergenciasCentralDepositaria = executar.ConsultarDivergenciasCentralDepositaria(FiltroDivergenciaCentralDepositaria);

                if (ListaDivergenciasCentralDepositaria.Count > 0)
                {
                    ListaDivergenciasCentralDepositaria.EnableStateControl = true;
                    this.View.AtualizarListaDivergenciasCentralDepositaria();
                }
                else
                {
                    this.View.InformarPesquisaSemResultado();
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }

        } 
        #endregion

        #region ExecutarConciliacaoCentralDepositaria
        /// <summary>
        /// Executa a conciliação de alocação de negócios na central depositaria
        /// </summary>
        public void ExecutarConciliacaoCentralDepositaria()
        {
            try
            {
                Communication.DivergenciaCentralDepositaria executar = new Sinacor.UI.Bovespa.Alocacao.Communication.DivergenciaCentralDepositaria(this.Session);
                executar.ExecutarConciliacaoCentralDepositaria(FiltroDivergenciaCentralDepositaria);
                this.View.InformarSucessoExecucaoConciliacao();
                executar.ConsultarDivergenciasCentralDepositaria(FiltroDivergenciaCentralDepositaria);
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        } 
        #endregion

        #region Inicializar
        /// <summary>
        /// Inicializa controles da aba
        /// </summary>
        public void Inicializar()
        {
            try
            {
                ConsultarCalendarios();
                this.View.AtualizarListaCalendarios();
                ObterInformacoesMovimento();
                this.View.SelecionarDataPregaoDivergenciaCentralDepositaria(_informacoesMovimento);
                ObterNalcValido();
            }
            catch (Exception ex)
            {
                
                base.HandleException(ex);
            }
            
        } 
        #endregion

        #region ObterNalcValido
        /// <summary>
        /// Obtem o Nalc Valido
        /// </summary>
        public void ObterNalcValido()
        {
            try
            {
                Communication.DivergenciaCentralDepositaria divergencia = new Communication.DivergenciaCentralDepositaria(this.Session);
                ObterInformacoesMovimento();
                this.NalcValido = divergencia.ObterNalcValido(new Model.Parameter.FiltroNalc { DataPregao = this.InformacoesMovimento.DataMovimento });
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        } 
        #endregion

        #region ReenviarDivergenciasSelecionadas
        /// <summary>
        /// Reenvia as mensagens de divergencias selecionadas.
        /// </summary>
        /// <param name="modelList"></param>
        public void ReenviarDivergenciasSelecionadas(ModelCollection<Model.DivergenciaCentralDepositaria> modelList)
        {
            ModelCollection<Model.DivergenciaCentralDepositaria> listaSelecionadas = new ModelCollection<Model.DivergenciaCentralDepositaria>();
            bool temNaoEnviados = false;
            
            try
            {
                if (this.View.ConfirmarReenvioMensagens())
                {
                    foreach (Model.DivergenciaCentralDepositaria item in modelList)
                    {
                        if (item.Origem == Model.Enum.OrigemMensagem.Sinacor && item.CodigoUsuario == null)
                            item.IndicadorCiencia = true;
                        else
                            temNaoEnviados = true;

                        listaSelecionadas.Add(item);
                    }

                    if (temNaoEnviados)
                        View.InformarMensagemNaoEnviada();

                    Communication.DivergenciaCentralDepositaria executar = new Sinacor.UI.Bovespa.Alocacao.Communication.DivergenciaCentralDepositaria(this.Session);
                    executar.ReenviarMensagensDivergenciasCentralDepositaria(listaSelecionadas);
                    this.View.InformarSucessoReenvioMensagens();
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        } 
        #endregion

        #region ReenviarMensagensDivergencias
        /// <summary>
        /// Reenvia mensagem de divergência na alocação de negócio à central depositária.
        /// </summary>
        /// <param name="modelList"></param>
        private void ReenviarMensagensDivergencias(ModelCollection<Model.DivergenciaCentralDepositaria> modelList)
        {
            try
            {
                Communication.DivergenciaCentralDepositaria executar = new Sinacor.UI.Bovespa.Alocacao.Communication.DivergenciaCentralDepositaria(this.Session);
                executar.ReenviarMensagensDivergenciasCentralDepositaria(ListaDivergenciasCentralDepositaria);
                this.View.InformarSucessoReenvioMensagens();
                executar.ConsultarDivergenciasCentralDepositaria(FiltroDivergenciaCentralDepositaria);
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }

        } 
        #endregion

        #region ReenviarTodasDivergencias
        /// <summary>
        /// Marca todas as models da lista de divergencias de alocação de negócios na
        /// central depositaria para reenvio e reenvia as mensagens
        /// </summary>
        public void ReenviarTodasDivergencias()
        {
            bool temNaoEnviados = false;
            
            try
            {
                if (this.View.ConfirmarReenvioTodasMensagens())
                {
                    foreach (Model.DivergenciaCentralDepositaria item in ListaDivergenciasCentralDepositaria)
                    {
                        if (item.Origem == Model.Enum.OrigemMensagem.Sinacor && item.CodigoUsuario == null)
                        {
                            item.IndicadorCiencia = true;
                            item.Origem = Model.Enum.OrigemMensagem.Sinacor;
                        }
                        else
                            temNaoEnviados = true;
                    }

                    if (temNaoEnviados)
                        View.InformarMensagemNaoEnviada();

                    ReenviarMensagensDivergencias(ListaDivergenciasCentralDepositaria);
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
 
        } 
        #endregion
		#endregion
	}

}